package com.bcx.crm.java.proxy.cglibProxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * Created by ys on 2018/1/19.
 * 参考网址：https://blog.csdn.net/yakoo5/article/details/9099133/
 *
 * 1.CDLib采用非常底层的字节码技术，其原理是通过字节码技术为一个类创建子类，并在子类中采用方法拦截的技术拦截所有父类方法的调用
 *   顺势织入横切逻辑
 * 2.该类完成了创建子类的方法与代理的方法
 *   2.1getProxyInstance()通过扩展父类的class来创建代理对象
 *   2.2intercept()拦截所有目标类方法的调用
 * 3.
 */
public class ProxyFactory implements MethodInterceptor{
    private Object target;
    public ProxyFactory(Object target){
        this.target=target;
    }
    public Object getProxyInstance(){   //3.
        Enhancer en = new Enhancer();
        en.setSuperclass(target.getClass());  //设置需要创建子类的类
        en.setCallback(this);
        return en.create();   //通过字节码技术动态创建子类实例
    }

    /**
     *
     * @param o 目标类的实例
     * @param method 目标类方法的反射对象
     * @param args 方法的动态入参
     * @param methodProxy 代理类实例
     */
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("---开始事务-");
        //通过代理类调用父类(UserDao)中的方法
        Object returnValue = method.invoke(target, args);
        System.out.println("提交事物--");
        return returnValue;
    }
}
